package com.example.hctorisrael.deadolympics;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import org.andengine.engine.Engine;
import org.andengine.engine.camera.Camera;
import org.andengine.entity.primitive.Rectangle;
import org.andengine.entity.scene.background.SpriteBackground;
import org.andengine.entity.scene.menu.MenuScene;
import org.andengine.entity.scene.menu.item.IMenuItem;
import org.andengine.entity.scene.menu.item.SpriteMenuItem;
import org.andengine.entity.scene.menu.item.decorator.ScaleMenuItemDecorator;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.text.Text;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.font.Font;
import org.andengine.opengl.font.FontFactory;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.util.GLState;
import org.andengine.util.adt.align.HorizontalAlign;

import java.util.Random;

/**
 * Created by HectorIsrael on 03/05/2015.
 */
public class EscenaEstado extends EscenaBase {

    private Engine engine;
    private ControlJuego actividad;
    private Sprite spriteFondo; //(el fondo de la escena, estatico)
    private int tiempo = 0;
    //Botones
    private MenuScene estado;
    private final int OPCION_NEXT = 0;
    private Marcador marcador;
    public EscenaJuego valor;
    private Rectangle gameover;
    private Text txtGameOver;


    @Override
    public void crearEscena() {
        // Creamos el sprite de manera optima
        spriteFondo = new Sprite(0,0, admRecursos.regionEstadoJuego,admRecursos.vbom) {
            @Override
            protected void preDraw(GLState pGLState, Camera pCamera) {
                super.preDraw(pGLState, pCamera);
                pGLState.enableDither();
            }
        };
        spriteFondo.setPosition(ControlJuego.ANCHO_CAMARA/2,ControlJuego.ALTO_CAMARA/2);

        SpriteBackground fondo = new SpriteBackground(0,0,0,spriteFondo);
        setBackground(fondo);
        setBackgroundEnabled(true);

        agregarBoton();
        agregarMarcador();
        //agregarGameOver();
    }

    private void agregarBoton(){
        estado = new MenuScene(admRecursos.camara);
        estado.setPosition(ControlJuego.ANCHO_CAMARA/2, ControlJuego.ALTO_CAMARA/2);

        final IMenuItem opcionNext = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_NEXT,
                admRecursos.regionBotonSiguiente,admRecursos.vbom), 1.5f, 1);
        // Agrega las opciones al menú
        estado.addMenuItem(opcionNext);
        estado.buildAnimations();
        estado.setBackgroundEnabled(false);
        estado.setPosition(0, 0);
        estado.setOnMenuItemClickListener(new MenuScene.IOnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClicked(MenuScene pMenuScene, IMenuItem pMenuItem,
                                             float pMenuItemLocalX, float pMenuItemLocalY) {
                switch (pMenuItem.getID()) {
                    case OPCION_NEXT:
                        siguiente();
                        break;
                    default:
                        return false;
                }
                return true;
            }
        });
        //estado.attachChild(opcionNext);
        setChildScene(estado);
    }

    public void agregarMarcador() {
        marcador = new Marcador(admRecursos.engine, admRecursos.actividadJuego);
        admRecursos.camara.setHUD(marcador);
        marcador.quitarMarcadorMasAltoDos();
        marcador.quitarMarcadorMasAlto();

        // Para marcador más alto. PRIMERO lee el marcador anterior
        SharedPreferences preferencias = admRecursos.actividadJuego.getSharedPreferences(
                "Estado", Context.MODE_PRIVATE);
        int vidas = preferencias.getInt("vidas", marcador.getVidas());
        marcador.setVidas(vidas);

        //para leer el putnaje actual
        int puntaje = preferencias.getInt("puntaje",marcador.getMarcador());
        marcador.setMarcador(puntaje);

        //puntaj mas alto
        int ultimoMarcador = preferencias.getInt("First",marcador.getMarcadorMasAlto());
        marcador.setMarcadorMasAlto(ultimoMarcador);

        //Segundo mas alto
        int penultimoMarcador = preferencias.getInt("Second",marcador.getMarcadorMasAlto());
        marcador.setMarcadorMasAltoDos(penultimoMarcador);

        marcador.moverMarcadorMasAltoDos(400,100);
        estado.attachChild(marcador);
    }


    private void agregarGameOver(){
        // Un cuadro negro transparente arriba a la derecha
        gameover = new Rectangle(ControlJuego.ANCHO_CAMARA/2,ControlJuego.ALTO_CAMARA/2,
                250,100, engine.getVertexBufferObjectManager());

        this.attachChild(gameover);

        // Letrero sobre el cuadro
        Font tipo = crearTipoLetra();
        txtGameOver = new Text(ControlJuego.ANCHO_CAMARA/2,ControlJuego.ALTO_CAMARA / 2,
                tipo,"GAME OVER",15,engine.getVertexBufferObjectManager());
        txtGameOver.setWidth(300);
        txtGameOver.setHeight(230);
        txtGameOver.setHorizontalAlign(HorizontalAlign.CENTER);

        // Agrega el marcador al recuadro trasparente
        gameover.attachChild(txtGameOver);
    }

    private Font crearTipoLetra() {
        // La imagen que contiene cada símbolo
        final ITexture fontTexture = new BitmapTextureAtlas(engine.getTextureManager(),1024,1024);

        // Carga el archivo, tamaño 36, antialias y color
        Font tipoLetra = FontFactory.createFromAsset(engine.getFontManager(),
                fontTexture, actividad.getAssets(), "gameover.ttf", 36, true, 0xFFFFFFFF);
        tipoLetra.load();
        tipoLetra.prepareLetters("Puntos: 0123456789".toCharArray());

        return tipoLetra;
    }

    @Override
    protected void onManagedUpdate(float pSecondsElapsed) {
        super.onManagedUpdate(pSecondsElapsed);
        if(marcador.getVidas()<=0){
            estado.setVisible(true);
            marcador.quitarVidas();
            marcador.quitarMarcador();
            marcador.quitarMarcadorMasAlto();
            irEscenaPerdiste();

        }

    }

    @Override
    public boolean onSceneTouchEvent(TouchEvent pSceneTouchEvent) {


        return super.onSceneTouchEvent(pSceneTouchEvent);
    }

    // Regresar al menu principal
    private void siguiente() {
        Random r = new Random();
        int numero = r.nextInt(3);
        if(numero == 0) {
            admEscenas.crearEscenaJuego();
            admEscenas.setEscena(TipoEscena.ESCENA_JUEGO);
            admEscenas.liberarEscenaEstado();
        }

        if(numero == 1) {
            admEscenas.crearEscenaJuegoDos();
            admEscenas.setEscena(TipoEscena.ESCENA_JUEGODOS);
            admEscenas.liberarEscenaEstado();
        }

        if(numero == 2) {
            admEscenas.crearEscenaJuegoTres();
            admEscenas.setEscena(TipoEscena.ESCENA_JUEGOTRES);
            admEscenas.liberarEscenaEstado();
        }
        //musicaFondo.stop();
    }

    private void regresarAMenu(){
        admEscenas.crearEscenaMenu();
        admEscenas.setEscena(TipoEscena.ESCENA_MENU);
        admEscenas.liberarEscenaEstado();
        admRecursos.camara.setHUD(null);
    }

    private void irEscenaPerdiste(){
        admEscenas.crearEscenaPerdiste();
        admEscenas.setEscena(TipoEscena.ESCENA_PERDISTE);
        admEscenas.liberarEscenaEstado();
    }

    // El usuario oprime el boton de BACK; regresar al menu principal
    @Override
    public void onBackKeyPressed() {

        regresarAMenu();
    }

    @Override
    public TipoEscena getTipoEscena() {
        return TipoEscena.ESCENA_ESTADO;
    }

    @Override
    public void liberarEscena() {
       //Liberar cada recurso usado en esta escena
        spriteFondo.detachSelf();
        spriteFondo.dispose();
        this.detachSelf();      // La escena misma se deconecta del engine
        this.dispose();         // Libera la memoria
        //admRecursos.camara.setHUD(null);
    }

}
